Linux 管理用户和用户组
常见 QA
全名和用户名的区别
用户名 是用来登陆 Linux 系统的
全名 只是对用户名的一个备注说明(就是显示在 Shell 的那个)
超管和普通用户的区别
超管:root(用户名就是root)
最开始创建的不是 root 用户,而是一个普通用户
日常维护工作使用普通用户完成,除非遇到系统管理的工作,使用 root 来完成
普通用户要用超管命令则前面加个 sudo
有5分钟的有效期,在有效期内使用 sudo 不需要再输入密码
如何查看有哪些用户在线
如果要看目前有谁在线上,可以下达 who 这个指令
who :查看当前登录用户信息
如果想看登录历史可以使用下面这个
who /var/log/wtmp
可以查看自从 wtmp 文件创建以来的每一次登陆情况(就是查看全部的登陆 ip 地址等)
-b
:查看系统最近一次启动时间-H
:打印每列的标题
用户相关的命令
useradd 创建用户 ⭐
参考资料 ubuntu普通用户不能使用sudo
# 创建一个用户
sudo useradd 用户名
# 创建一个用户并将其加入到sudo用户组 ⭐
sudo useradd name -m -G sudo
# 直接创建用户并将其添加到组里面
# -c 参数是设置用户全名(就是备注)
sudo useradd -G mygroup1 -c "1 st user" myuser1
# 创建一个不能登陆的用户
# -s 参数:设置登陆后使用的终端
sudo useradd -c "this user can't login" -s /bin/nologin myuser3
参数
-m
:默认创建的账户是没有 home 目录的
如果加上 -m
来创建才有 home 目录
sudo useradd -m user1
也可以通过 -d
命令指定这个用户的家目录
-e<有效期限>
:指定帐号的有效期限。
-s<shell>
:指定用户登入后所使用的shell。
-g
:选择所在组(就是给用户分组)
sudo useradd -g 组名 用户名
可以通过 id
命令查看当前账户(这个组必须先存在)
id alsritter
# 输出
uid=1000(alsritter) gid=1000(alsritter) groups=1000(alsritter),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),114(netdev)
添加密码(不设置密码是无法用的)
sudo passwd 用户名
同理,超管也是需要设置了密码才能用
sudo passwd root
如果要改密码直接 passwd
就可以了
注意:ubuntu 普通用户不能使用 sudo,需要先把这个用户加入 sudo 组里面才能使用 sudo
sudo usermod -a -G sudo name
cat /etc/group
查看用户信息
id
查看id信息 或者 id username
whoami
当前登陆用户
who
罗列 当前登陆 的所有用户
查看所有用户
$ cat /etc/passwd |cut -f 1 -d :
usermod 修改用户信息
得在 root 权限下使用这个命令,它的参数就和上面创建用户能用的参数一样
# 修改初始组(一般不改)
usermod -g xxgroup xxuser
# 修改附加组(注意是覆盖的,所以要保存之前的组则要全部写下来)
usermod -G xxgroup,xxgroup xxuser # 一般也不用这个命令,直接用上面的groupmems 命令就好了
# 修改 shell
usermod -s /bin/bash xxuser
# 重设 username 的密码。
passwd <username>
# 查看用户的信息
cat /etc/passwd
# 输出--------------------------------------------->
alsritter:x:1000:1000:alsritter_Ubuntu,,,:/home/alsritter:/bin/bash
user1:x:1001:1001::/home/user1:/bin/sh
# 第一个是用户名,
# 第二个是密码(默认是x显示),
# 第三个是UID,
# 第四个是GID,
# 第五个是全名,
# 第六个是home目录
# 第七个是使用的shell
passwd 修改用户密码
Linux passwd 命令用来更改使用者的密码
passwd [-k] [-l] [-u [-f]] [-d] [-S] [username]
必要参数:
-d 删除密码
-f 强迫用户下次登录时必须修改口令
-w 口令要到期提前警告的天数
-k 更新只能发送在过期之后
-l 停止账号使用
-S 显示密码信息
-u 启用已被停止的账户
-x 指定口令最长存活期
-g 修改群组密码
指定口令最短存活期
-i 口令过期后多少天停用账户
使用例
passwd alsritter # 设置 alsritter 用户的密码
# Enter new UNIX password: # 输入新密码,输入的密码无回显
# Retype new UNIX password: # 确认密码
# passwd: password updated successfully
#
显示账号密码信息
su 用户的切换
su 用户名
用户切换
如果处于 root 用户则是输入 exit
退出用户 或者 ctrl+d
userdel 用户的删除
userdel
命令
删除用户:userdel 用户名
删除用户同时还删除其 home 目录:userdel -r 用户名
强制删除用户(当该用户还处于登陆状态也给删了):userdel -f 用户名
用户组相关命令
每个用户都有一个初始组(创建用户时会自动创建一个同名的组),可以有零个或多个附加组。用户组的作用,是为了方便权限控制
组与用户是多对多的关系
一个组有多个用户,一个用户属于多个组
- 添加用户组:
groupadd 组名
- 查看所有组:
cat /etc/group
- 命名、改名:
groupmod -n 新名称 原名称
- 删除组:
groupdel 组名
默认存在的用户组
root UID: 0 超级用户帐号,几乎没有任何约束并且不考虑其他所有的登陆,保护和许可;可以进入系统访问
daemon UID: 1 控制后台进程的系统帐号
bin UID: 2 管理大部分命令的帐号
sys UID: 3 管理许多系统文件的帐号
adm UID: 4 管理某些管理文件的帐号
lp UID: 71 打印服务帐号
smtp UID: 0 smtp邮件者使用简单网络管理协议。SMTP是INTERNET标准协议
uucp UID: 5 为UNIX-to-UNIX拷贝程序(UUCP)捆绑数据文件和目标的帐号
nuucp UID: 6 使用远程系统登陆到主机传送文件的帐号
listen UID: 37 网络监听帐号
nobody UID: 60001 匿名帐号,当独立于root用户建立一个需求时分派NFS服务器。nobody帐号分派软件进程时不需要任何特殊的权限。
groupmems 管理用户群组
语法:
groupmems [选项] [动作]
选项:
-g、--group groupname
:超级用户可以指定修改哪个组的组成员列表
-R、--root CHROOT_DIR
:chroot 到的目录 (搞不懂..)
动作:
-a, --add username
:将用户 username 添加到组成员中
-d, --delete username
:从组的成员中删除用户 username
-h, --help
:显示此帮助信息并推出
-p, --purge
:从组中移除所有成员
-l, --list
:列出组中的所有成员
基本操作组的指令 ⭐
sudo groupadd groupname # 创建组
sudo groupmod -n new_name old_name # 修改组名
sudo groupdel groupname # 删除组
sudo groupmems -g sudo -a git # 把 git 用户加入到 sudo 组里 ⭐
注意,修改组后要切换用户再切换回来刷新环境变量
su root #切换到root用户
su ${USER} #再切换到原来的应用用户以上配置才生效(这个 ${USER} 是默认用户)
# 直接创建用户并将其添加到组里面
sudo useradd -G mygroup1 -c "1 st user" myuser1
修改文件用户组 chgrp
chgrp 组群 文件名 -R
# -R表示递归目录下所有文件
修改文件所属组群:chgrp 命令 修改文件所属组群很简单 chgrp 命令,就是 change group 的缩写
语法:
chgrp 组群 文件名/目录
使用示例
[root@redhat ~]# groupadd groupa
[root@redhat ~]# groupadd groupb
[root@redhat ~]# useradd -g groupa zgz
[root@redhat ~]# su - zgz
[zgz@redhat ~]$ touch filea
[zgz@redhat ~]$ touch fileb
[zgz@redhat ~]$ ls -l
total 8
-rw-r--r-- 1 zgz groupa 0 Sep 26 05:48 filea
-rw-r--r-- 1 zgz groupa 0 Sep 26 05:50 fileb
[root@redhat zgz]# chgrp groupb filea --改变filea所属群组
[root@redhat zgz]# ls -l
total 8
-rw-r--r-- 1 zgz groupb 0 Sep 26 05:48 filea
-rw-r--r-- 1 zgz groupa 0 Sep 26 05:50 fileb
查看用户当前组
1、groups 命令法,groups 命令可以查看某个用户所属的用户组
- 只执行
groups
命令,可以查看系统当前登录用户的所属组 groups alsritter
, 查询特定用户的用户组,在 groups 后面跟用户名即可
2、通过 /etc/group
查看所有组
cat /etc/group # 查看所有组
# 输出----------------------------------------------------->
alsritter:x:1000:
sambashare:x:126:alsritter
user1:x:1001:
# 1. 组名
# 2. 组密码标志
# 3. GID
# 4. 组中附加用户
检查文件或者文件夹所处的组
ls -lh
给用户 root 权限
方法一: 修改 /etc/sudoers 文件,找到下面一行,把前面的注释(#)去掉
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL #去掉这个注释
然后修改用户,使其属于 root组(wheel),命令如下:
usermod -g root alsritter
修改完毕,现在可以用 alsritter 帐号登录,然后用命令 su – ,即可获得 root 权限进行操作。
方法二: 修改 /etc/sudoers 文件,找到下面一行,在 root 下面添加一行,如下所示:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
alsritter ALL=(ALL) ALL
注意显示只读使用 !wq
退出
使用测试
# 先使用 alsritter 用户创建一个文件夹
touch testdir
# 创建一个组
sudo groupadd testgroup
# 让其位于这个组
sudo groupmems -g testgroup -a alsritter
# 检查是否进入了这个组
groups alsritter
# alsritter : alsritter adm dialout cdrom floppy sudo audio dip video plugdev netdev docker testgroup
# 创建新用户,并将其加入组中
sudo useradd testuser -G testgroup
# 或者使用 usermod -g wang test # 创建用户test,并将其加入到用户组 wang 中
sudo passwd testuser
# 123456
su testuser
# 先检查组
groups testuser
# testuser : testuser testgroup
# 检查目录的权限
# drwxr-xr-x 2 root root 4096 6月 22 09:46 test
# 可见,同组的成员只有 rx 权限
然后尝试删除
# 检查文件组
ls -lh
# drwxrwxr-x 2 root root 4.0K 6月 22 09:46 test
# 发现是 root 组的,所以得把它换成自定义的那个组
sudo chgrp testgroup test -R
# 然后别忘了给这个目录添加权限
sudo chmod -R g+w test # w 可以修改文件夹内文件(可以删除,新增文件、文件夹)
# 再次检查
ls -lh
# drwxrwxr-x 2 root testgroup 4.0K 6月 22 09:46 test
# 再次删除测试
rm -r test
依旧无法删除
修改文件夹所有者
# chown [-R] 账号名称:组群 文件/目录
sudo chown -R testuser:testgroup test
这里记录一些常用的操作
管理用户和用户组
某学校的同一导师带的课题组会分组,这些同一组的同学间必须要能够互相修改对方的数据文件,但是同时这些同学又需要保留自己的私密数据,因此直接公开家目录是不适宜的。
任务一:单纯的完成上头交代的任务,假设我们需要的账号数据如下,你该如何实作?规划如下的账户:
su root
groupadd mygroup1
# 注意:全名是对用户名的一个备注说明。
# -s 参数:设置登陆后使用的终端
useradd -G mygroup1 -c "1 st user" -s /bin/bash myuser1
useradd -G mygroup1 -c "2nd user" -s /bin/bash myuser2
# 创建一个不能登陆的用户
useradd -c "3rd user" -s /bin/nologin myuser3
# 更改用户的密码
# 这里 --stdin 来接收管道传入的,注意因为 Ubuntu 无法使用这个 stdin
# echo password | passwd --stdin user 更改为:
# echo user:pass | chpasswd
echo "password" | passwd --stdin myuser1
echo "password" | passwd --stdin myuser2
echo "password" | passwd --stdin myuser3
任务二:有三个人员 pro1, pro2, pro3 是同一个项目计划的开发人员,我想要让这三个用户在同一个目录底下工作, 但这三个用户还是拥有自己的家目录与基本的私有群组。假设我要让这个项目计划在 /srv/projecta
目录下开发, 该如何设置账户和组的信息?
su root
groupadd project
# 注意:全名是对用户名的一个备注说明。
# -s 参数:设置登陆后使用的终端
useradd -G project -c "1st user" -s /bin/bash pro1
useradd -G project -c "2nd user" -s /bin/bash pro2
useradd -G project -c "3rd user" -s /bin/bash pro3
# 更改用户的密码
# 这里 --stdin 来接收管道传入的,注意因为 Ubuntu 无法使用这个 stdin
# echo password | passwd --stdin user 更改为:
# echo user:pass | chpasswd
echo "password" | passwd --stdin pro1
echo "password" | passwd --stdin pro2
echo "password" | passwd --stdin pro3
# 如果是 Ubuntu
# echo pro1:password | chpasswd
# echo pro2:password | chpasswd
# echo pro3:password | chpasswd
mkdir /srv/projecta
chgrp project /srv/projecta
chmod 2770 /srv/projecta
ll -d /srv/projecta